import Axios from 'axios'
import ConfigDomain from './init'
import {Message} from 'element-ui'

// 创建一个新的axios请求对象，避免对其他对象造成污染
let instance = Axios.create()

// Axios 请求拦截
instance.interceptors.request.use(
    config => {
        // 添加请求地址前缀信息
        // config.url = Config.API_Prefix + config.url
        var domains = ConfigDomain.domains
        var url_type = config.url.split(":")[0]
        if (domains[url_type] != undefined) {
            config.url_type = url_type
            config.url = domains[url_type] + config.url.split(":")[1]
        } else if(config.url.substring(0,4) != "http" && config.url.substring(0,2) != "//"){
            alert("域名前缀未配置："+config.url)
        }
        config.data = config.data
        console.log("config:", config); // 该处可以将config打印出来看一下，该部分将发送给后端（server端）
        config.headers["Content-Type"] = 'application/json'
        config.headers["Authorization"] = "Bearer " + localStorage.getItem("express_admin_token")
        // 追加Header
        if(ConfigDomain.headers[url_type] != undefined){
            for(var i in ConfigDomain.headers[url_type]){
                config.headers[i] = ConfigDomain.headers[url_type][i]
            }
        }
        return config // 对config处理完后返回，下一步将向后端发送请求
    },
    error => { // 当发生错误时，执行该部分代码
        console.log("error:", error); //调试用
        return Promise.reject(error)
    }
)

// Axios 响应拦截
instance.interceptors.response.use(
    response => { // 该处为后端返回整个内容
        console.log("respone-success:", response)
        const res = response.data;
        if(response.status != 200){
            Message.error("网络状态返回错误：" + response.statusText)
            return Promise.reject(res)
        }
        // 不同的端有不同的错误处理逻辑，所以此处使用config.url_type进行判断
        // 判断前缀为：config/init.js -> domains.xxxx
        if(response.config.url_type != undefined){
            return ConfigDomain.respones[response.config.url_type](res)
        }
        return res
    },
    error => {
        console.log("respone-error:", error)
        return Promise.reject(error)
    }
)

// 将该对象进行导出
export default instance
